package dailynewsreader.view;

import dailynewsreader.controller.FileOperations;
import dailynewsreader.controller.SubscriptionManager;
import dailynewsreader.model.LabelStorage;
import dailynewsreader.model.SearchFeed;
import dailynewsreader.model.RSSFeed;
import dailynewsreader.model.RSSEntry;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 * Ez a program fő ablaka
 *
 * @author Zen
 */
public class RSSReaderFrame extends JFrame {

    /**
     * Az egyetlen ablak objektum (singleton)
     */
    private static RSSReaderFrame frame = null;
    /**
     * A panel objektum, amiben történnek az események
     */
    private static RSSReaderPanel panel;
    
    /**
     * A feed-eket kezelő controller
     */
    private static SubscriptionManager subManager;

    /**
     * Konstruktor
     */
    private RSSReaderFrame() {
        super(LabelStorage.FRAME_LABEL);        
        this.init();
    }

    /**
     * Inicializálja az ablak tulajdonásgait
     */
    private void init() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000, 700);
        this.setLocation(100, 100);
        String pathToIcon = "dailynewsreader/resources/dnr_icon.png";        
        this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource(pathToIcon)));

        subManager = new SubscriptionManager();
        
        //a panel inicializálása
        panel = new RSSReaderPanel(subManager);
        this.add(panel);
        
        //cache betöltés, vagy default feliratkozások
        ArrayList<RSSFeed> feeds = new ArrayList<RSSFeed>();
        try {
            feeds = FileOperations.getInstance().read();
            for (RSSFeed feed : feeds) {
                subManager.addSubscription(feed);
            }
            try {
                subManager.refreshAllFeeds();
            } catch (IOException ex2) {
                this.showNoConnError(ex2);
            }
        } catch (FileNotFoundException ex) {
            System.err.println("Nincs cache file! " + ex.getMessage());
            
            try {
                subManager.addSubscription("http://immanuel60.hu/feed/");
                subManager.addSubscription("http://techcorner.feedsportal.com/c/35253/f/655654/index.rss");
                subManager.addSubscription("http://origo.hu/contentpartner/rss/hircentrum/origo.xml");
                subManager.addSubscription("http://rss.cnn.com/rss/edition.rss");
            } catch (IOException ex2) {
                this.showNoConnError(ex2);
            }
        }
        
        
        
        
        
        
        
        /*
         * Ezt a blokkot töröld majd ki, csak mutatom, hogy hogyan kell használni
         * 
         * -- BEGIN
         */
        
//        teszt keresés a feed-ek nevében: 2db találat: PC World Online Hírek, [origo] Hírcentrum
        ArrayList<RSSFeed> sfeeds = subManager.getFeedsFor("Hír");
        //ellenőrzés
        for (RSSFeed sfeed : sfeeds) {
            //System.out.println(sfeed);
        }
        
//        teszt keresés az összes feed bejegyzéseiben: 4db találat (aktuálisan ennyi volt mikor futtattam)
        ArrayList<RSSFeed> sfeeds2 = subManager.getFeeds();
        SearchFeed sf = new SearchFeed();
        for (RSSFeed feed : sfeeds2) {
            sf.appendEntries(feed.getEntriesFor("kész"));
        }
        //ellenőrzés
        for (RSSEntry entry : sf.getEntries()) {
            //System.out.println(entry);
        }       
        
//        teszt keresés előszűrt feed-ek bejegyzéseiben: 2db találat (aktuálisan ennyi volt mikor futtattam)
        ArrayList<RSSFeed> sfeeds3 = subManager.getFeedsFor("Hír");
        SearchFeed sf2 = new SearchFeed();
        for (RSSFeed feed : sfeeds3) {
            sf2.appendEntries(feed.getEntriesFor("kész"));
        }
        //ellenőrzés
        for (RSSEntry entry : sf2.getEntries()) {
            //System.out.println(entry);
        }
        
        /*
         * -- END
         */
        
        
        
        
        
        
        
        
        //tree view
        ArrayList<String> rssFeeds = new ArrayList<>();
        for (RSSFeed feed : subManager.getFeeds()) {            
            rssFeeds.add(feed.getTitle());
        }
        panel.setRSSFeedSelection(rssFeeds);
        
        panel.setRSSViewerContent(subManager.getFeeds());
        
        this.addWindowListener(exitListener);
        this.setVisible(true);
    }
    
    /**
     * Megjeleníti a hibaüzenetet
     * 
     * @param ex A hiba
     */
    private void showNoConnError(Exception ex) {
        if (ex.getMessage().equals("noConnectionError")){
            JOptionPane.showMessageDialog(this, LabelStorage.ERROR_DESCRIPTION + "Nincs internet kapcsolat!", LabelStorage.ERROR_TITLE, JOptionPane.ERROR_MESSAGE);
            panel.setEnabled(false);
        }
        else{
            JOptionPane.showMessageDialog(this, LabelStorage.ERROR_DESCRIPTION + ex.getMessage(), LabelStorage.ERROR_TITLE, JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * A singleton mintának megfelelően létrehozza és/vagy visszaadja az
     * egyetlen objektumot
     *
     * @return Az ablak objektum
     */
    public static RSSReaderFrame getInstance() {
        if (frame == null) {
            frame = new RSSReaderFrame();
        }
        return frame;
    }
    
    /**
     * A kilépést kezelő esemény
     */
    WindowListener exitListener = new WindowAdapter() {

        @Override
        public void windowClosing(WindowEvent e) {
            FileOperations.getInstance().write(subManager.getFeeds());
       
            System.exit(0);
        }
    };
}
